module WIDTH_CHK(
    input Clk ,
    input Rst ,
    input Sig ,
    output reg Err_o
);

parameter COUNT=10 ;
parameter BIT=7 ;

reg [1:0] PR_ST ;
reg [BIT-1:0] CNT ;
reg [1:0] NXT_ST ;
reg Sig_D, Sig_2D ;
wire Pos_Det, Neg_Det ;

assign Pos_Det = Sig & ~Sig_D ;
assign Neg_Det = ~Sig & Sig_D ; 

always @(posedge Clk or negedge Rst)begin
if(Rst==1'b0)begin
        Sig_D <= 1'b0 ;
    end else begin
        Sig_D <= Sig ;
    end
end

always @(posedge Clk or negedge Rst)begin
    if(Rst==1'b0)begin
        CNT <= 'd0 ;
        Err_o <= 1'b0 ;
        PR_ST <= 2'b00 ;
        end
    else begin
        PR_ST <= NXT_ST ;
          case(PR_ST)
            2'b00: // IDLE
            begin
            CNT <= 'd0 ;
            Err_o <= 1'b0 ;
            end

            2'b01: // CNT
            begin
            CNT <= CNT + 1 ;
            Err_o <= 1'b0 ;
            end

            2'b10: // CHK
            begin
            if(CNT!=COUNT)
            Err_o <= 1'b1 ;
            else
            Err_o <= 1'b0 ;
        end
        endcase
    end
end

always @(*)begin
case(PR_ST)
    2'b00: // IDLE
    begin
    if(Pos_Det==1'b1)
        NXT_ST = 2'b01 ;
    else
        NXT_ST = PR_ST ;
    end

    2'b01: // CNT
    begin
    if(Neg_Det==1'b1)
        NXT_ST = 2'b10 ;
    else
        NXT_ST = PR_ST ;
    end
    
    2'b10: // CHK
    begin
        NXT_ST = 2'b00 ;
    end
    endcase
end
endmodule

